
def guanjia(game):
    def inner():
        print('开外挂')
        game()
        print('关外挂')
    return inner

def play_dnf():
    print('又是美好的一天')

@guanjia
def play_lol():
    print('德玛西亚!!!!!')

play_dnf = guanjia(play_dnf)
play_dnf()
# @guanjia 等价 play_dnf = guanjia(play_dnf)
play_lol()



def warpper1(func): # 装饰器函数
    def inner(*args,**kwargs): # 内部函数
        print("装饰器函数1") # 扩展功能
        ret = func(*args,**kwargs) # 调用原函数
        print("装饰器函数1") # 扩展功能
        return ret # 返回原函数的返回值
    return inner # 返回内部函数
def warpper2(func): # 装饰器函数
    def inner(*args,**kwargs): # 内部函数
        print("装饰器函数2") # 扩展功能
        ret = func(*args,**kwargs) # 调用原函数
        print("装饰器函数2") # 扩展功能
        return ret # 返回原函数的返回值
    return inner # 返回内部函数
@warpper1 # 装饰器
@warpper2 # 装饰器
def fun(*args,**kwargs): # 原函数
    print("原函数")
fun()
# 打印顺序 ： 装饰器函数2 装饰器函数1 原函数 装饰器函数1 装饰器函数2
